import axios from 'axios'
import {networkConfig} from '/src/config/networkConfig'
import {getToken, setToken} from "./auth";
import errorCode from "./errorCode";
import {ElMessageBox, ElMessage, ElNotification} from 'element-plus'
import {store} from "../store";
//import {getNewToken} from "../api/login2";


// 发送请求的时候带上cookie
axios.defaults.withCredentials = true;

// 创建axios实例
export function requestService(config) {
    const service = axios.create({
        // axios中请求配置有baseURL选项，表示请求URL公共部分
        baseURL: '/devApi',
        // 超时
        timeout: networkConfig.requestTimeout
    })
    // request拦截器
    service.interceptors.request.use(config => {
        // 是否需要设置 token
        if (getToken()) {
            // 让每个请求携带自定义token 请根据实际情况自行修改
            config.headers['Authorization'] = getToken()
        }
        // get请求映射params参数
        if (config.method === 'get' && config.params) {
            let url = config.url + '?';
            for (const propName of Object.keys(config.params)) {
                const value = config.params[propName];
                var part = encodeURIComponent(propName) + "=";
                if (value !== null && typeof (value) !== "undefined") {
                    if (typeof value === 'object') {
                        for (const key of Object.keys(value)) {
                            let params = propName + '[' + key + ']';
                            var subPart = encodeURIComponent(params) + "=";
                            url += subPart + encodeURIComponent(value[key]) + "&";
                        }
                    } else {
                        url += part + encodeURIComponent(value) + "&";
                    }
                }
            }
            url = url.slice(0, -1);
            config.params = {};
            config.url = url;
        }
        return config
    }, error => {
        console.log(error)
        Promise.reject(error)
    })

    // 响应拦截器
    service.interceptors.response.use(res => {
            // 未设置状态码则默认成功状态
            const code = res.data.code || 200;
            // 获取错误信息
            const msg = errorCode[code] || res.data.msg || errorCode['default']
            if (code === 500) {
                ElMessage({
                    message: msg,
                    type: 'error'
                })
                return Promise.reject(new Error(msg))
            } else if (code !== 200) {
                ElNotification.error({
                    title: msg
                })
                return Promise.reject('error')
            } else {
                return res.data
            }
        },
        error => {
            //登录态过期
            if (error.response.status === 401) {
                //return doRequest(error)
            } else if (error.response.status === 500) {
                const msg = error.response.data
                ElMessage({
                    message: msg,
                    type: 'error'
                })
                return Promise.reject(new Error(msg))
            }
            return Promise.reject(error)
        }
    )
    return service(config)
}

async function doRequest(error) {
    try {
        const data = await getNewToken();
        setToken(data.access_token)
        const res = await requestService(error.config)
        return res;
    } catch (err) {
        ElMessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
                confirmButtonText: '重新登录',
                cancelButtonText: '取消',
                type: 'warning'
            }
        ).then(() => {
            store.dispatch('LogOut').then(() => {
                location.href = '/index';
            })
        }).catch(() => {
        });
        return err;
    }
}
